home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-11-04 | 14.2 KB | 301 lines |
- DEFINITION MODULE sig;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* Signalbehandlung. *)
- (* *)
- (* Ein Fehler ist immer dann aufgetreten, wenn bei Funktionen mit Typ INTEGER*)
- (* ein negativer Wert zurueckgegeben wird. *)
- (* Die genaue Fehlerursache kann bei Bedarf ueber 'ERRNO.errno' und die *)
- (* entsprechenden Konstanten ermittelt werden. Die Funktionen veraendern *)
- (* 'errno' nur dann, wenn ein Fehler aufgetreten ist, bei erfolgreicher Aus- *)
- (* fuehrung wird 'errno' nicht veraendert. *)
- (* *)
- (* GEMDOS: *)
- (* Die Eigenschaften der Funktionen unter dem ``blanken'' GEMDOS sind z.T. *)
- (* stark eingeschraenkt; unter dem Stichwort GEMDOS ist deswegen immer *)
- (* angegeben, in wieweit die Funktion emuliert werden kann. Ist MiNT-Unter- *)
- (* stuetzung angegeben, so ist unter der Betriebssystemerweiterung MiNT *)
- (* eine bessere Unterstuetzung der Funktionen zu erwarten; wie weit diese *)
- (* geht, ist unter dem Stichwort MiNT angegeben. *)
- (* --------------------------------------------------------------------------*)
- (* 30-Okt-93, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM PORTAB IMPORT
- (* TYPE *) UNSIGNEDLONG, UNSIGNEDWORD, WORDSET;
-
- FROM types IMPORT
- (* TYPE *) pidT;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- CONST
- SigDfl = LC(0);
- SigIgn = LC(1);
-
-
- TYPE
- Signal = (
- SIGNULL, (* kein ``richtiges'' Signal, nicht POSIX *)
- SIGHUP,
- SIGINT,
- SIGQUIT,
- SIGILL,
- SIGTRAP, (* nicht POSIX *)
- SIGABRT,
- SIGPRIV, (* nicht POSIX *)
- SIGFPE,
- SIGKILL,
- SIGBUS, (* nicht POSIX *)
- SIGSEGV,
- SIGSYS, (* nicht POSIX *)
- SIGPIPE,
- SIGALRM,
- SIGTERM,
- SIGURG, (* nicht POSIX *)
- SIGSTOP, (* nur unterstuetzt, falls ``Job Control'' vorhanden *)
- SIGTSTP, (* nur unterstuetzt, falls ``Job Control'' vorhanden *)
- SIGCONT, (* nur unterstuetzt, falls ``Job Control'' vorhanden *)
- SIGCHLD, (* nur unterstuetzt, falls ``Job Control'' vorhanden *)
- SIGTTIN, (* nur unterstuetzt, falls ``Job Control'' vorhanden *)
- SIGTTOU, (* nur unterstuetzt, falls ``Job Control'' vorhanden *)
- SIGIO, (* nicht POSIX *)
- SIGXCPU, (* nicht POSIX *)
- SIGXFSZ, (* nicht POSIX *)
- SIGVTALRM, (* nicht POSIX *)
- SIGPROF, (* nicht POSIX *)
- SIGWINCH, (* nicht POSIX *)
- SIGUSR1,
- SIGUSR2
- );
-
- (* Die folgende Konstante muss je nach Anzahl der Signale von Hand
- * neu berechnet werden.
- *)
- CONST
- MAXSIGSET = 1; (* := ORD(MAX(Signal)) DIV (ORD(MAX(WORDSETRANGE))+1) *)
-
- TYPE
- SigsetRange = [0..MAXSIGSET];
-
- TYPE
- SigsetPtr = POINTER TO sigsetT;
-
- TYPE
- (* Implementierung des Typs nur zur Benutzung innerhalb dieses Moduls *)
- sigsetT = ARRAY SigsetRange OF WORDSET;
-
-
- TYPE
- SigHandler = PROCEDURE((* EIN/ -- ) sig : *)Signal );
-
- TYPE
- SignalHandler = RECORD
- CASE TAG_COLON BOOLEAN OF
- FALSE: proc : SigHandler;
- |TRUE : long : UNSIGNEDLONG; (* fuer 'SigIgn', 'SigDfl' *)
- END;
- END;
-
- TYPE
- #if reverse_set
- SaFlags = (
- Sa15, Sa14, Sa13, Sa12, Sa11, Sa10,
- Sa9, Sa8, Sa7, Sa6, Sa5, Sa4, Sa3, Sa2, Sa1,
- SaNoCldStop (* Stoppen eines Unterprozesses erzeugt kein Signal *)
- );
- #else
- SaFlags = (
- SaNoCldStop, (* Stoppen eines Unterprozesses erzeugt kein Signal *)
- Sa1, Sa2, Sa3, Sa4, Sa5, Sa6, Sa7, Sa8, Sa9,
- Sa10, Sa11, Sa12, Sa13, Sa14, Sa15
- );
- #endif
-
- TYPE
- SigactionPtr = POINTER TO SigactionRec;
-
- SigactionRec = RECORD
- saHandler : SignalHandler; (* Funktion fuer Signalbehandlung *)
- saMask : sigsetT; (* zusaetzlich blockierte Signale waehrend *)
- (* der Abarbeitung des Signals *)
- saFlags : SaFlags; (* Flags, die Signalbehandlung beeinflussen *)
- END;
-
-
- TYPE
- BlockType = (
- SigBlock, (* angegebene Signale zusaetzlich blockieren *)
- SigUnBlock, (* angegebene Signale nicht blockieren *)
- SigSetMask (* ausschliesslich die angegebenen Signale blockieren *)
- );
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE sigemptyset ((* -- /AUS *) VAR set : sigsetT );
-
- PROCEDURE sigfillset ((* -- /AUS *) VAR set : sigsetT );
-
- PROCEDURE sigaddset ((* EIN/AUS *) VAR set : sigsetT;
- (* EIN/ -- *) sig : Signal ): INTEGER;
-
- PROCEDURE sigdelset ((* EIN/AUS *) VAR set : sigsetT;
- (* EIN/ -- *) sig : Signal ): INTEGER;
-
- PROCEDURE sigismember ((* EIN/ -- *) set : sigsetT;
- (* EIN/ -- *) sig : Signal ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Die Funktionen stellen Operationen fuer das Arbeiten mit dem Typ |
- | 'sigsetT' dar. Es sollten ausschliesslich diese Funktionen benutzt werden|
- | Es werden nur die uebergebenen Variablen manipuliert, fuer das Aendern |
- | Signalmaske des Prozesses ist z.B. "sigprocmask()" zu verwenden! |
- | |
- | "sigemptyset": erstellt eine Signalmaske, in der kein Signal gesetzt ist.|
- | "sigfillset" : erstellt eine Signalmaske, in der alle Signale gesetzt |
- | sind. |
- | "sigaddset" : Fuegt das Signal <sig> zur Signalmaske hinzu. |
- | "sigdelset" : Entfernt das Signal <sig> aus der Signalmaske. |
- | "sigismember": Testet, ob das Signal <sig> in der Signalmaske enthalten |
- | ist; liefert als Funktionswert eins, falls das Signal ent-|
- | halten ist, Null sonst. |
- | |
- | GEMDOS: Keine Besonderheiten. |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE sigaction ((* EIN/ -- *) sig : Signal;
- (* EIN/ -- *) act : SigactionPtr;
- (* EIN/ -- *) oact : SigactionPtr ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Mit dieser Funktion kann festgelegt werden, welche Funktionen beim Auf- |
- | treten eines bestimmten Signals ausgefuehrt werden soll, und welche |
- | Signale waehrend der Ausfuehrung des ``Signalhandlers'' zusaetzlich zum |
- | ausloesenden Signal blockiert werden sollen. |
- | Falls <act> oder <oact> gleich NULL sind (nicht NIL!), werden sie igno- |
- | riert. |
- | |
- | GEMDOS: (noch) nicht implementiert |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE sigprocmask ((* EIN/ -- *) how : BlockType;
- (* EIN/ -- *) set : SigsetPtr;
- (* EIN/ -- *) oset : SigsetPtr ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Mit dieser Funktion kann der aufrufende Prozess seine Signalmaske ver- |
- | aendern, d.h. festlegen, welche Signale blockiert werden sollen. |
- | |
- | <how> = SigBlock : Die Signalmaske ist die Vereinigung der bisherigen |
- | Maske mit <set>. |
- | <how> = SigUnBlock: Die Signalmaske ist die Differenz der bisherigen |
- | Maske und <set>. |
- | <how> = SigSetMask: <set> wird zur aktuellen Signalmaske. |
- | |
- | In <oset>^ wird die bisherige Signalmaske zurueckgeliefert. |
- | Falls <set> oder <oset> gleich NULL sind (nicht NIL!), werden sie igno- |
- | riert. |
- | |
- | GEMDOS: Keine Besonderheiten. |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE sigpending ((* -- /AUS *) VAR set : sigsetT ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Ermittelt, welche Signale fuer den Prozess generiert wurden, aber zur |
- | Zeit blockiert sind. |
- | |
- | GEMDOS: Keine Besonderheiten. |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE kill ((* EIN/ -- *) pid : pidT;
- (* EIN/ -- *) sig : Signal ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Sendet das Signal <sig> an den Prozess oder die Prozessgruppe <pid>. |
- | |
- | <pid> > 0: <sig> wird an den Prozess mit der Kennung <pid> gesendet. |
- | <pid> = 0: <sig> wird an alle Prozesse gesendet, die in der gleichen |
- | Prozessgruppe wie der aufrufende Prozess sind. |
- | <pid> = -1: systemspezifische Aktion. |
- | <pid> < -1: <sig> wird an alle Prozesse gesendet, die in der Prozess- |
- | gruppe |<pid>| sind. |
- | |
- | GEMDOS: Ein Signal kann nur an sich selbst gesendet werden. |
- | MiNT: Keine Besonderheiten. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE pause ( ): INTEGER;
-
- PROCEDURE sigsuspend ((* EIN/ -- *) sigmask : sigsetT ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | "pause()" suspendiert den aufrufenden Prozess bis ein Signal auftritt. |
- | Bei "sigsuspend()" kann festgelegt werden, welche Signale waehrend des |
- | Wartens blockiert sind. |
- | Falls das Signal durch einen Handler abgefangen wird, der normal zurueck-|
- | kehrt, wird -1 zurueckgeliefert und 'errno' auf 'EINTR' gesetzt, sonst |
- | wird der Prozess terminiert. |
- | |
- | GEMDOS: kehrt immer mit -1 zurueck (errno = 'EINTR'). |
- | MiNT: Keine Besonderheiten. |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE sleep ((* EIN/ -- *) seconds : CARDINAL ): CARDINAL;
-
- (*--------------------------------------------------------------------------
- | Suspendiert den aufrufenden Prozess fuer <seconds> Sekunden, oder bis |
- | ein Signal auftritt. Als Funktionswert wird Null zurueckgegeben oder, bei|
- | Auftreten eines Signals, die Differenz der bisher verstrichenen Zeit zu |
- | <seconds>. |
- | "sleep()" und "alarm()" sollten moeglichst nicht beide in einem Programm |
- | benutzt werden. |
- | Aus Portabilitaetsgruenden sollte <seconds> nicht groesser als 65535 sein|
- | |
- | GEMDOS: Es wird ein ``Busy waiting'' durchgefuehrt. |
- | MiNT: Vor Version 1.08 kann keine Unterbrechung durch ein Signal statt-|
- | finden. |
- | Es wird immer Null zurueckgeliefert. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE alarm ((* EIN/ -- *) seconds : CARDINAL ): CARDINAL;
-
- (*--------------------------------------------------------------------------
- | Sendet das Signal 'SIGALRM' nach <seconds> Sekunden an den aufrufenden |
- | Prozess. Wenn kein entsprechender Handler installiert wurde, wird der |
- | Prozess nach der angegebenen Zeit terminiert. Ist <seconds> gleich Null, |
- | wird ein zuvor in Auftrag gegebener Alarm zurueckgesetzt. |
- | Als Funktionswert werden die Anzahl Sekunden bis zu einem evtl. frueher |
- | eingeplanten Alarm zurueckgeliefert. |
- | "sleep()" und "alarm()" sollten moeglichst nicht beide in einem Programm |
- | benutzt werden. |
- | Aus Portabilitaetsgruenden sollte <seconds> nicht groesser als 65535 sein|
- | |
- | GEMDOS: Es wird Null zurueckgegeben und nichts passiert. |
- | MiNT: Keine Besonderheiten. |
- --------------------------------------------------------------------------*)
-
- END sig.
-
-